//
//  UITextView+Emoticon.swift
//  GZWeibo009
//
//  Created by gzxzmac on 16/4/2.
//  Copyright © 2016年 gzxzmac. All rights reserved.
//

import UIKit

extension UITextView {
    
    /// 将带表情图片的属性文本,转成带表情名称的文本
    func emoticonText() -> String {
        // 获取textView里面的内容
        // 属性文本里面的内容是分段保存的,如果是附件后面附加的字典里面会有 NSAttachment Key
        //        print("textView.attributedText: \(textView.attributedText)")
        /// 遍历属性文本,获取里面的每一段
        var result = ""
        attributedText.enumerateAttributesInRange(NSRange(location: 0, length: attributedText.length), options: NSAttributedStringEnumerationOptions(rawValue: 0)) { (dict, range, _) -> Void in
            // 如果dict里面有 "NSAttachment" 表示的是附件,没有就是普通文本
            if let attachment = dict["NSAttachment"] as? CZTextAttachment {
                // 附件, 通过附件来获取表情的名称
                result += attachment.chs!
            } else {
                // 普通文本和emoji
                let subString = (self.attributedText.string as NSString).substringWithRange(range)
                result += subString
            }
        }
        
       return result
    }
    
    /**
     给textView来设置对应的内容
     
     - parameter emoticon: 点击的模型
     */
    func insetEmoticon(emoticon: CZEmoticonModel) {
        
        // 添加emoji表情
        if let emoji = emoticon.emoji {
            // 将emoji添加到textView上面
            insertText(emoji)
            return
        }
        
        // 图片表情
        if let fullPngPath = emoticon.fullPngPath {
//            // 图片->附件->属性文本
//            let atachment = CZTextAttachment()
//            atachment.image = UIImage(named: fullPngPath)
//            // 设置表情名称给附件
//            atachment.chs = emoticon.chs
//            
//            let wh = (font?.lineHeight ?? 20)// * 0.8
//            // bounds和frame正好相反,往下移是负数
//            atachment.bounds = CGRect(x: 0, y: -3, width: wh, height: wh)
//            
//            // 转成可变的属性文本
//            let attrM = NSMutableAttributedString(attributedString: NSAttributedString(attachment: atachment))
//            
//            // 给附件设置UIFont属性,不然后面的表情会很小
//            attrM.addAttribute(NSFontAttributeName, value: font!, range: NSRange(location: 0, length: 1))
            
            let attrM = emoticon.emotionModeToAttr(font!)
            
            // 不能直接替换属性文本.拿到之前的属性文本
            let oldAtrrM = NSMutableAttributedString(attributedString: attributedText)
            
            let oldRange = selectedRange
            // 将附件添加到之前的属性文本里面
            oldAtrrM.replaceCharactersInRange(oldRange, withAttributedString: attrM)
            
            attributedText = oldAtrrM
            
            // 光标会跑到最后去
            selectedRange = NSRange(location: oldRange.location + 1, length: 0)
            
            // 触发textView文本改变
            NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: self)
            
            // 主动调用代理方法
            delegate?.textViewDidChange?(self)
        }
    }
}
